作者:销销销hdbuaj | 来源:互联网 | 2023-09-02 11:52
篇首语:本文由编程笔记#小编为大家整理,主要介绍了Verilog学习笔记相关的知识,希望对你有一定的参考价值。
文章目录
- 参考来源:china.pub.com
- 一、Verilog HDL简介
- 二、HDL指南
- 2.1 模块(module)
- 2.2时延
- 2.3数据流描述方式
- 2.4行为表述方式
- 2.5 结构化描述形式
- 2.6混合设计描述方式
- 三、Verilog语言要素
- 3.1标识符
- 3.2 注释
- 3.3编译指令
- 3.4 值集合
- 3.5 数据类型
- 3.6参数
- 四、表达式
参考来源:china.pub.com
一、Verilog HDL简介
1.1 Verilog HDL
- Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的
数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之
间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
- Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构
组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模
语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设
计外部访问设计,包括模拟的具体控制和运行。
二、HDL指南
2.1 模块(module)
- 基本语法:
- 说明部分语句最好放在module开头部分
- 端口默认大小为一位,线网型(线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。)
module module name (port list)i
Declarations
reg, wire, parameter,
input, output, inout
function, task,
statements
Initial statement
Always statement
Module ins tantiation
Gate instantiation
UDP instantiation
Continuous assignment
endmodule
2.2时延
`` timescale** 1ns /100ps`编译器指令在模块描述前定义,表示时延时间单位为 1 n s并且时间精度为100ps
#2
表示2个时间单位
2.3数据流描述方式
- 连续赋值语句
- 语法:
assign [delay] LHS_net = RHS_ expression
- 右表达式使用的操作数一旦发生变化 , 右边表达式都重新计算 , 在指定的时延后变化值(默认为0)被赋予左边表达式的线网类型变量。
- 连续赋值语句只能为线网类型变量赋值
- 连续赋值语句是并发执行的,各语句的执行顺序与其在描述中出现的顺序无关
2.4行为表述方式
2.5 结构化描述形式
- 内置门原语(在门级);XOR,OR,AND
- 开关级原语(在晶体管级);
- 用户定义的原语(在门级);
- 模块实例 (创建层次结构)。
2.6混合设计描述方式
- 模块描述中可以包含实例化的门、模块实例化语句、连续赋值语句以及 always语句和initial语句的混合。它们之间可以相互包含。来自 always语句和initial语句(切记只有寄存器类型数据可以在这两种语句中赋值)的值能够驱动门或开关,而来自于门或连续赋值语句(只能驱动线网)的值能够反过来用于触发always语句和initial语句。
三、Verilog语言要素
3.1标识符
- 标识符是任意一组字母、数字、 $符号和_(下划线)符号的组合,但第一个字符必须是字母或者下划线。标识符区分大小写。
- 转义标识符在一条标识符中包含任何可打印字符。转义标识符以 \\ (反斜线)符号开头,以空白结尾
3.2 注释
3.3编译指令
指令 | 使用 | 含义 |
---|
define** | ** define MAX _BUS _SIZE 3 2 | 用于文本替换,它很像 C语言中的#define 指令 | |
undef** | ** undef MAX _BUS _SIZE 3 2 | 指令取消前面定义的宏。 | |
ifdef else 、 endif | ![](https://img6.php1.cn/3cdc5/a056/525/e616c2446ca4dbb5.jpeg) | 条件编译 |
default_nettype** | ** default_nettype wand | 令用于为隐式线网指定线网类型。是将那些没有被说明的连线定义线网类型。 | |
include** | ** include " . . / . . /primitives.v | 用于嵌入内嵌文件的内容。文件既可以用相对路径名定义,也可以用全路径名定义 | |
resetall** | ** resetall | 将所有的编译指令重新设置为缺省值。 | |
timescale** | ** timescale time _ unit / time _ preciso | 用于定义时延的单位time _ unit和时延精度time _ preciso | |
3.4 值集合
值 | 0 | 1 | z | x |
---|
含义 | 逻辑0或“假” | 逻辑1或“真” | 高阻 | 未知 |
- 字符串的表示方式:字符串是双引号内的字符序列。字符串不能分成多行书写。用8位A S C I I值表示的字符可看作是无符号整数。
“INTERNAL ERROR”
reg [1:8*14] Message;
3.5 数据类型
3.5.1线网类型
3.5.2 寄存器类型
类型 | 使用 | 含义 |
---|
reg | reg [ msb: lsb] reg1, reg2, . . . r e g N; | reg是最常见的数据类型。msb和l s b 定义了范围。范围定义是可选的;缺省值为1位寄存器。 |
存储器 | ![](https://img6.php1.cn/3cdc5/a056/525/30afa4a83d55c37e.jpeg) | 数组的维数不能大于 2。注意存储器属于寄存器数组类型。 |
Integer | ![](https://img6.php1.cn/3cdc5/a056/525/881381af43cef41e.jpeg) | 缺省32位。整数不能作为位向量访问。种截取位值的方法是将整数赋值给一般的 r e g类型变量,然后从中选取相应的位 |
time | ![](https://img6.php1.cn/3cdc5/a056/525/d0aa64d69824a6b7.jpeg) | time类型的寄存器用于存储和处理时间。缺省64位。只存储无符号数。 |
real和realtime | ![](https://img6.php1.cn/3cdc5/a056/525/15aae2d7800fed9b.jpeg) | realtime与real类型完全相同。r e a l说明的变量的缺省值为0。不允许对r e a l声明值域、位界限或字节界限。 |
3.6参数
- 参数是一个常量。参数经常用于定义时延和变量的宽度。使用参数说明的参数只被赋值一次。
- 语法:
![](https://img6.php1.cn/3cdc5/a056/525/5eee395cafa770f7.jpeg)
四、表达式
4.1操作数
4.2操作符